package com.webflux.sample.webfluxmain;

import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

public class _6do_message {

  public static void main(String[] args) {
    // 在调用subscribe方法时可以指定需要处理的消息类型。
    System.out.println("step 1.1，注意异步数据打印问题");
    Flux.just(1, 2).concatWith(Mono.error(new IllegalStateException())).subscribe(System.out::println, System.err::println);

    System.out.println("step 1.2");
    Flux.just(1, 2).concatWith(Mono.error(new IllegalStateException())).onErrorReturn(0).subscribe(System.out::println);

    // 第2种可以通过onErrorReturn()方法来使用另外的流来产生元素。
    System.out.println("step 2");
    Flux.just(1, 2).concatWith(Mono.error(new IllegalStateException())).onErrorReturn(-999).subscribe(System.out::println);

    // 第3种是通过onErrorReturn()方法来根据不同的异常类型来选择要使用的产生元素的流。
    System.out.println("step 3");
    Flux.just(1, 2)
        .concatWith(Mono.error(new IllegalArgumentException()))
        .onErrorReturn(e -> e instanceof IllegalStateException, -1)
        .onErrorReturn(e -> e instanceof IllegalArgumentException, -2)
        .onErrorReturn(-999)
        .subscribe(System.out::println);

    System.out.println("step 4");
    // 当出现错误时还可以使用retry操作符来进行重试。重试的动作是通过重新订阅序列来实现的。在使用retry操作时还可以指定重试的次数
    Flux.just(1, 2).concatWith(Mono.error(new IllegalStateException()))
        .retry(3).subscribe(System.out::println);
  }

}
